package Presentacion;

import ModeloLogicoSistema.AdministradorOrden;
import ModeloLogicoSistema.Orden;
import ModeloLogicoSistema.Servicio.TipoServicio;
import java.text.SimpleDateFormat;

/**
 *  Este Programa es software libre su codigo fuente es liberado bajo los terminos de la GNU GPL
 *	Ver LICENSE.TXT o conectarse a mnis de http://www.gnu.org/licenses/gpl.txt para Informacion.
 *
 * @author Jefferson Amado Pe&ntilde;a Torres <jeffersonamado@gmail.com>
 * @version 1.00 2008
 * @see Interfaz.java
*/



import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
//import java.text.SimpleDateFormat;
import java.util.*;
import java.sql.SQLException;
/**
*la Clase Calendaro.java implementa el calendario de la aplicacion
*Agenda en linea
*/
public class CalendarioPpal extends JPanel{

    
    
    private ArrayList<String> txtBotones;
    private AdministradorOrden adm;
    
    private ArrayList<Orden> ordenes = null;
    private SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
    Calendar c = new GregorianCalendar();
    private Calendar cal;
    private Date date;
    private String fecha;
    Integer cod;
    AdministradorOrden admOrdenes;
    
    
		//Articulos  de la pestania calendario
		protected int yy,mm,dd;/*Anio,Mes,Dia*/
		JPanel pnBotones;/*para aniadir los botones del los dias*/
		JButton botones[][];/*arreglo de botones en el panel*/
		protected int enBlanco = 0;/*para poner los dias en blanco*/
		private Calendar calendar = new GregorianCalendar();
		//private Recordatorio objRecordatorio=new Recordatorio(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));;
		public String tablaUso="";
		private JLabel etqImagen= new JLabel();
		private ImageIcon Imagenes[];
		public JPanel pnOrganizar;

		final int esteAnio = calendar.get(Calendar.YEAR);
		final int esteMes = calendar.get(Calendar.MONTH);
		JButton b0,bhoy;
		JComboBox cambioMes;
		JComboBox cambioAnio;
		int diActivo = -1;
                CalendarioPpal _this;

                        
  		protected String[] meses = { "Enero", "Febrero", "Marzo","Abril", "Mayo", "Junio","Julio", "Agosto", "Septiembre", "Octubre", "Noviembre","Diciembre" };

      		protected int diaMes[] ={31, 28, 31 	/*enero,febre,mar*/
					,30,31, 30		/*abril,mayo,junio*/
					,31, 31,30		/*julio,agosto,sep*/
      					,31,30, 31 };	/*octu,nov,dic*/
                
                

		/**
		*metodo contructor para la clase
		*/
  		public CalendarioPpal(){
			estableceFecha(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
                        
                        _this=this;
        		OrganizarComponentes();
                        int diaActual = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);                            
                        this.bhoy=botones[(enBlanco + diaActual - 1) / 7][(enBlanco + diaActual - 1) % 7];
  		}
		/**
		*
		*/
	  	public CalendarioPpal(int year, int month, int today) {

	    		estableceFecha(year, month, today);
	    		OrganizarComponentes();
	  	}

		/**
		*@param a&ntilde;o pone el año al envio 
		*@param mes pone el mes que se va  crear el recordatorio
		*@param dia  pone el dia que tiene el recordatorio
		*/
		private void estableceFecha(int anio, int mes, int dia) {
		    yy = anio;
		    mm = mes;
		    dd = dia;
		}
		/**
		*Muestra la Interfaz Para nuevos Recordatorios
		*/
/*		public void  mostrarRecoradatorio(){
			objRecordatorio.mostrarComponentes();
		}
*/		
		/**
		*Establece el nombre de la tabla que va usar el panel calendario
		*/
		public void EstablecerDatos(String tbl){
			tablaUso=tbl;
			//System.out.println(" cajava agendalendario 88 "+tablaUso);
		}
		/**
		*Establece el nombre de la tabla que va usar la ventana de recordatorios
		*/
/*		public void  tablaRecordatorio(String tbl){
			objRecordatorio.tablaUsar(tbl);
		}
*/		/**
		*metodo para la organizacion de los  Componentes en la interfaz
		*/
		public void OrganizarComponentes(){
			setBorder(BorderFactory.createEtchedBorder());
    			setLayout(new BorderLayout());
    		
			pnOrganizar = new JPanel();
			pnOrganizar.add(cambioMes = new JComboBox());//para el mes
			pnOrganizar.add(cambioAnio = new JComboBox());//para el anio
    		
    			cambioMes.getAccessibleContext().setAccessibleName("Meses");
			cambioAnio.setEditable(false);
    		
    			for (int i = 0; i < meses.length; i++)
				cambioMes.addItem(meses[i]);
    				cambioMes.setSelectedItem(meses[mm]);
    				//cambioMes.addActionListener(this);
    				cambioMes.addActionListener(new ActionListener() {
					   	public void actionPerformed(ActionEvent ae) {						        
						int i =cambioMes.getSelectedIndex();
					        if (i >= 0) {
                                                    mm = i;
						  		//System.out.println("Mes=" + mm);
                                                    genActualidad();
                                                    if(mm==esteMes & yy==esteAnio){
                                                         _this.pintarFechaActual(Color.pink);
                                                    }
                                                    else{   
                                                        //int diaActual = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);                            
                                                        //_this.bhoy = botones[(enBlanco + diaActual - 1) / 7][(enBlanco + diaActual - 1) % 7];
                                                    
                                                        _this.bhoy.setBackground(b0.getBackground());
                                                        //b.setBackground(Color.red);
                                                        _this.bhoy.repaint();
                                                    }
					        }
					    }
				});
				
    			//for (int i = yy - 5; i < yy + 5; i++)
    			for (int i = yy-2 ; i < yy + 5; i++)
      				cambioAnio.addItem(Integer.toString(i));
				cambioAnio.setSelectedItem(Integer.toString(yy));
    				//cambioAnio.addActionListener(this);
    				cambioAnio.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae) {
					        int i = cambioAnio.getSelectedIndex();
					        if (i >= 0) {
								yy = Integer.parseInt(cambioAnio.getSelectedItem().toString());
								//System.out.println("Anio=" + yy);
					          	genActualidad();
                                                        if(mm==esteMes & yy==esteAnio){
                                                         _this.pintarFechaActual(Color.pink);
                                                    }
                                                    else{   
                                                        //int diaActual = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);                            
                                                        //_this.bhoy = botones[(enBlanco + diaActual - 1) / 7][(enBlanco + diaActual - 1) % 7];
                                                    
                                                        _this.bhoy.setBackground(b0.getBackground());
                                                        //b.setBackground(Color.red);
                                                        _this.bhoy.repaint();
                                                    }
					        }
					      }
					    });


    			add(BorderLayout.WEST, pnOrganizar);
			/* cabecera del calendario*/
    			botones = new JButton[6][7];
				pnBotones = new JPanel();
				pnBotones.setLayout(new GridLayout(7, 7));
				pnBotones.add(b0 = new JButton("Dom"));
				pnBotones.add(new JButton("Lun"));
				pnBotones.add(new JButton("Mar"));
				pnBotones.add(new JButton("Mier"));
				pnBotones.add(new JButton("Jue"));
				pnBotones.add(new JButton("Vier"));
				pnBotones.add(new JButton("Sab"));

			/*para poner color al dia senializado*/
			    ActionListener dateSetter = new ActionListener() {
      				public void actionPerformed(ActionEvent e) {
                                        
        				String num = e.getActionCommand();
        				if (!num.equals("")) {
 							establecerdiaActivo(Integer.parseInt(num));
                                                        
                                                        
/**
 * Codigo Propio VEKO
 */                                                                              
 _this.establezcoPestaniasPendientes();
                                                                                        
/**
 * Funcion implementada al final
 */                                                        
        				}
      			}};
      				
			//Inicializo los botones
		    	for (int i = 0; i < 6; i++) //dias
			for (int j = 0; j < 7; j++) { //semanas
		        	pnBotones.add(botones[i][j] = new JButton(""));
		        	botones[i][j].addActionListener(dateSetter);
		      	}	
			//INICIALIZO LA IMAGENES DEL CALENDARIO
			Imagenes= new ImageIcon[12];//iconos en la interfaz
			
			Imagenes[0] = new ImageIcon("Imagenes/Calendario/calendario1.jpg");
			Imagenes[1] = new ImageIcon("Imagenes/Calendario/calendario2.jpg");
			Imagenes[2] = new ImageIcon("Imagenes/Calendario/calendario3.jpg");
			Imagenes[3] = new ImageIcon("Imagenes/Calendario/calendario4.jpg");
			Imagenes[4] = new ImageIcon("Imagenes/Calendario/calendario5.jpg");
			Imagenes[5] = new ImageIcon("Imagenes/Calendario/calendario6.jpg");
			Imagenes[6] = new ImageIcon("Imagenes/Calendario/calendario7.jpg");
			Imagenes[7] = new ImageIcon("Imagenes/Calendario/calendario8.jpg");
			Imagenes[8] = new ImageIcon("Imagenes/Calendario/calendario9.jpg");
			Imagenes[9] = new ImageIcon("Imagenes/Calendario/calendario10.jpg");
			Imagenes[10] = new ImageIcon("Imagenes/Calendario/calendario11.jpg");
			Imagenes[11] = new ImageIcon("Imagenes/Calendario/calendario12.jpg");

			add(BorderLayout.EAST,pnBotones);
			add(BorderLayout.NORTH,etqImagen);
                        
    			genActualidad();
    			
		}//organizarComponentes
		/**
		*param int 
		*para poner una imagen en la cabeza del calendario
		*/
		public void cambioImagen(int i){
			//System.out.println("--->"+i);
			//if (i < 0 || i > 11)
			//throw new IllegalArgumentException("Mes:" + mm +" Fuera de rango 0-11");
			etqImagen.setHorizontalAlignment(JLabel.CENTER);
			etqImagen.setVerticalAlignment(JLabel.CENTER);
			etqImagen.setIcon(Imagenes[i]);
		}
		/**
		*para organizar los numeros de los dias y actualizar el calendario
		*/
		public void genActualidad(){
                        this.setearDelValPlan();
			//System.out.println("genActualidad: " + yy + ":" + mm+ ":" + dd);
			if (mm < 0 || mm > 11)
			throw new IllegalArgumentException("Mes:" + mm +" Fuera de rango 0-11");
				
			borradiaActivo();//borro el dia para establecer el dia Activo
			calendar = new GregorianCalendar(yy, mm, dd);//para obtener fecha
			enBlanco = new GregorianCalendar(yy, mm,1).get(Calendar.DAY_OF_WEEK) - 1;//para saber el numero que debo dejar
			int diasEnMes = diaMes[mm]; //establecezco el mes 
				if (visiesto(calendar.get(Calendar.YEAR)) && mm == 1)
				++diasEnMes; //si es visiesto aumento 
				//creo los dias al principio delcalendario en blanco
					for (int i = 0; i < enBlanco; i++)
					{
						 botones[0][i].setText("");
						botones[0][i].setEnabled(false);
 						 //botones[0][i].setVisible(false);
					}
				 	//elementos para las posiciones de los botones
                        		int fila=0;
					int columna=0;
					JButton b;
					cambioImagen(mm);//modifico la imagen del calendario
					//ciclo para poner el dia y aniadir al calendario
                                        
                                        ListIterator it=this.txtBotones.listIterator();
                                        for (int i = 1; i <= diasEnMes; i++) {
						fila=((enBlanco + i - 1) / 7);
						columna=((enBlanco + i - 1) % 7) ;
						b = botones[fila][columna];
						//b.setText(Integer.toString(i));
                                                if(it.hasNext()){
                                                    b.setText((String) it.next());
                                                    b.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/botonCalendario.png")));
                                                    b.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
                                                }
                                                
						b.setActionCommand(Integer.toString(i));
						b.setEnabled(true);
						b.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
						      		int mes=mm+1;
								Calendar anio = new GregorianCalendar();
								if(yy==anio.get(Calendar.YEAR)||yy>anio.get(Calendar.YEAR)&& mm==calendar.get(Calendar.MONTH)||mm>calendar.get(Calendar.MONTH)&&dd==calendar.get(Calendar.DAY_OF_MONTH)||dd>calendar.get(Calendar.DAY_OF_MONTH)){									
								}else{
									JOptionPane.showMessageDialog(null,"El año para el recordatorio\ndebe ser mayor al a\u00F1o","Error",JOptionPane.ERROR_MESSAGE);
								}
								
							}
						});
					}//el dia al calendario
					
					 //borro los botones sobrantes
					for(int i=fila;i<6;i++){
						if(i==fila){
							for(int j=columna+1;j<7;j++){
								botones[i][j].setText("");
								botones[i][j].setEnabled(false);
								botones[i][j].setText(""); 
						    		//botones[i][j].setVisible(false);
							}//for
						}else{
							for(int j=0;j<7;j++){
								botones[i][j].setEnabled(false);
								botones[i][j].setText(""); 
							 	//botones[i][j].setVisible(false);
							 }//for
						}
					}//for							
				if (esteAnio == yy && mm == esteMes)
				{
					establecerdiaActivo(dd); // shade the box for today
				}
				repaint();

		}
		/**
		*@param a&ntilde;o	comprueba sei es visiesto
		*@return boolean si es visiesto o no
		*/
		public boolean visiesto(int anio) {
		   if ((anio % 4 == 0 && anio % 100 != 0) || (anio % 4 == 0 && anio % 100 == 0 && anio % 400 == 0))
		     return true;
		   return false;
		}
		/**
		*@param int a&ntilde;o,int mes,int dias
		*/
	  	public void estblecerFecha(int yy, int mm, int dd) {
		    this.yy = yy;
		    this.mm = mm; // starts at 0, like Date
		    this.dd = dd;
		    genActualidad();
		}
		/**
		*borra el dia activo para establecer otro dia Activo
		*/
		private void borradiaActivo() {
		    JButton b;
	    		// First un-shade the previously-selected square, if any
			if (diActivo > 0) {
	      			b = botones[(enBlanco + diActivo - 1) / 7][(enBlanco + diActivo - 1) % 7];
	      			b.setBackground(b0.getBackground());
	      			//b.setBackground(Color.red);
	      			b.repaint();
	      			diActivo = -1;
	    		}
  	 	}
                
                
                
                private void pintarFechaActual(Color color){
                    int diaActual = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);                            
                    Component squareActual = botones[(enBlanco + diaActual - 1) / 7][(enBlanco + diaActual - 1) % 7];
                    squareActual.setBackground(color);
                    squareActual.repaint();
                }
                
  	 	/**
  	 	*establece el dia Activo
  	 	*/
		private void establecerdiaActivo(int dia){
			borradiaActivo();
			// si entra 0 o negativo toma en del Sistema
			if (dia <= 0){
                            dd = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);                            
                        }
                        else{
			    dd = dia;
                            if(mm==esteMes & yy==esteAnio){
                                _this.pintarFechaActual(Color.pink);
                            }
                            
                        }
			    //pongo color al dia en el calendario 
			Component square = botones[(enBlanco + dia - 1) / 7][(enBlanco + dia - 1) % 7];
                        
			square.setBackground(Color.CYAN);
			square.repaint();
			diActivo = dia;
		}

	public static void main(String[] args) {
// 		JFrame f=new JFrame();
// 		f.add(new calendario(1989,  7,  18));
// 		f.setVisible(true);
                JFrame f = new JFrame("Cal");
                Container c = f.getContentPane();
        
        
        c.setLayout(new FlowLayout());
        c.add(new CalendarioPpal());
        f.pack();
        f.setVisible(true);
		System.out.println("\nteclea \"java Agenda\"");
		System.out.println("\n Jefferson Amado Pe\u00F1a Torres");
                
	}  

    private void establezcoPestaniasPendientes() {
        
        String fecha;
        String day,month;
        if(dd<10){
            day="0"+dd;
        }
        else{
            day=Integer.toString(dd);
        }
        if(mm<9){
            month="0"+(mm+1);
        }
        else{
            month=Integer.toString(mm+1);
        }
        fecha = new String(day+"/"+month+"/"+yy);
        ordenes = new ArrayList<>();
        
        Ventana detalleOrdenes = null;
        detalleOrdenes = new Ventana(null, true);
        detalleOrdenes.cargarFecha(fecha);
        /*
        try {
            admOrdenes = new AdministradorOrden();
            
        } catch (SQLException ex) {}

        
        detalleOrdenes.cargarTablaOrdenesRealizadasAentregar(fecha);
        detalleOrdenes.cargarTablaOrdenesPendientes(fecha);
        detalleOrdenes.cargarTablaOrdenesAentregarYaEntregadas(fecha);
        detalleOrdenes.cargarTablaOrdenesIngresadas(fecha);
        detalleOrdenes.cargarTablaOrdenesRealizadas(fecha);
        detalleOrdenes.cargarTablaOrdenesEntregadas(fecha);*/
        
        detalleOrdenes.setVisible(true);
        this.genActualidad();

    }
    
    
  public void setearDelValPlan() {
        this.txtBotones=new ArrayList();
        String fecha;
        
        try {
            this.adm = new AdministradorOrden();
        } catch (SQLException ex) {
//            Logger.getLogger(Calend.class.getName()).log(Level.SEVERE, null, ex);
        }
        int cant = 0;
        int cantV = 0;
        int cantP = 0;
        int[] cantDias;
        int diaMesB[] ={31,29,31,30,31,30,31,31,30,31,30,31};

        if(this.visiesto(yy)){
            cantDias=diaMesB;
        }else{
            cantDias=diaMes;
        }
        for (int i = 1; i <=cantDias[mm]; i++) {

            try {
        
                 String day,month;
                if(i<10){
                    day="0"+i;
                }
                else{
                    day=Integer.toString(i);
                }
                if(mm<9){
                    month="0"+(mm+1);
                }
                else{
                    month=Integer.toString(mm+1);
                }
                fecha = new String(day+"/"+month+"/"+yy);
                
                cant = adm.getCantDeliverysPendientesParaDia(fecha);
                cantP = adm.getCantPendientes(fecha, TipoServicio.Planchado.toString());
                cantV = adm.getCantPendientes(fecha, TipoServicio.Valets.toString());

                 String txtBtn=("<html><center><p>" + Integer.toString(i) + "</p><p> Deliverys: " + cant + "</p><p> Valets: "
                    + cantV + "</p><p> Planchados: " + cantP + "</p></html>");
                 this.txtBotones.add(txtBtn);
            } catch (SQLException ex) {

            }

        }
  }
    
    
}